package pe.com.hermes.hermetic.web.controller.reportes;

import pe.com.hermes.hermetic.beans.AuditBean;
import pe.com.hermes.hermetic.beans.ComprobanteServicioBean;
import pe.com.hermes.hermetic.beans.FechaCuentaBean;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.negocio.ultil.ConstantesHermetic;
import pe.com.hermes.hermetic.negocio.ultil.Util;
import pe.com.hermes.hermetic.web.controller.base.IController;
import pe.com.hermes.hermetic.web.controller.base.IWebOpciones;
import pe.com.hermes.hermetic.web.controller.general.MostrarReporteController;
import pe.com.hermes.hermetic.web.forms.HMF3002Form;

import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;

@Controller
@SessionAttributes(value={"listadoUnidMone","listaCuentas","codOpci","desOpci"})
@RequestMapping("/mostrarHWF3002.html")
public class RemesasPorProcesarController implements IController{
    protected final static Logger logger = Logger.getLogger(BilletesRecontadosController.class);
    @Autowired
    private HermeticFacade servicioHermetic;
    
    @Autowired
    private MostrarReporteController reporteFactory;      
    
    @RequestMapping(method=RequestMethod.GET)        
    protected String showForm(ModelMap model,HttpServletRequest request)throws Exception{
        HttpSession session = request.getSession(false);        
        if (request.getSession().getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu3");
        if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.REPORTE_REMESA_POR_PROCESAR)) {
            return FORM_ACCESS_NULL_VIEW;
        }

        HMF3002Form form = new HMF3002Form();
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        String cliente = (String)request.getSession().getAttribute("cliente");
        String sucursal = (String)request.getSession().getAttribute("sucursal");

        try {

            form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
            form.setCliente(cliente);
            form.setSucursal(sucursal);
            form.setCuenta("");
            form.setFechadesde(null);
            form.setHora(null);
            form.setFormulario("HMR4010");
            form.setOpcion("2");
            String fecha = servicioHermetic.getFechaHoy();
            String horaServidor = servicioHermetic.getFecha2().substring(8, 13);
            form.setFechadesde(fecha);
            form.setHora(horaServidor);
            List listadoCuentas = servicioHermetic.getCuentas(sucursal, cliente);
            if (listadoCuentas != null) {
                model.put("listaCuentas", listadoCuentas);
                                    
                //Por defecto esta marcado TODOS las cuentas            
                String[] chksCuenta = Util.listToStringArray(listadoCuentas);     
                //request.getSession(false).setAttribute("chksCuenta",chksCuenta);
                String codCuentas = Util.arrayToString(chksCuenta,",");                         
                            
                //Agregar el codigo de cuenta de la pagina
                List listadoUnidMone = servicioHermetic.getTipoUnidadMonetariaCuentaMulti(sucursal, cliente, codCuentas);
                if (listadoUnidMone != null) {
                    model.put("listadoUnidMone", listadoUnidMone);
                }
            }    
            
            session.setAttribute("chksCuenta",null);
            session.setAttribute("chksModulo",null);
            session.setAttribute("chksSucu",null);
            session.removeAttribute("tipoUnidMone");
            AuditBean auditBean = new AuditBean(REME_POR_PROC);
            servicioHermetic.inseAudit(auditBean);
            String codOpci = IWebOpciones.REME_POR_PROC;
            String desOpci = servicioHermetic.getDesOpci(codOpci, request);
            model.put("codOpci",codOpci);
            model.put("desOpci",desOpci);
            model.put(FORM_KEY,form);  
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("Error en el proceso. "+ e);
            return FORM_ERROR_VIEW;
        }        

        return FORM_REMESA_POR_PROCESAR_VIEW;
    }
    @RequestMapping(params="accion=cargarModulo")
    private String cargarModulo (ModelMap model,@ModelAttribute(FORM_KEY) HMF3002Form form, HttpServletRequest request) throws Exception {    
    
        HttpSession session = request.getSession(false);        
        if (request.getSession().getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu3");
        if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.REPORTE_REMESA_POR_PROCESAR)) {
            return FORM_ACCESS_NULL_VIEW;
        }    
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        
        //int accionMapa = 1;
        String cliente = (String)request.getSession().getAttribute("cliente");
        String sucursal = (String)request.getSession().getAttribute("sucursal");
        
        String cuenta = form.getCuenta();
        form.setCuenta(form.getCuenta());
        String fecha = form.getFecha();
        form.setFecha(fecha);
        try {
            List listaModulos = 
                servicioHermetic.getBovedaCuenta(sucursal, cliente, 
                                                       cuenta);
            if (listaModulos != null) {
                model.put("listaModulo", listaModulos);
            }
            List listadoCuentas = 
                servicioHermetic.getCuentas(sucursal, cliente);
            if (listadoCuentas != null) {
                model.put("listaCuentas", listadoCuentas);
            }
            model.put("cliente", cliente);
            model.put("sucursal", sucursal);
            form.setCliente(cliente);
            form.setSucursal(sucursal);

            model.put(FORM_KEY,form);  
        } catch (Exception e) {
            e.printStackTrace();
            //accionMapa = 0;
            return FORM_ERROR_VIEW;
        }

        return FORM_REMESA_POR_PROCESAR_VIEW;
    }
    
    
    @RequestMapping(params="accion=cargarFecha")
    private String cargarFecha (ModelMap model,@ModelAttribute(FORM_KEY) HMF3002Form form, HttpServletRequest request) throws Exception {    
    
        HttpSession session = request.getSession(false);        
        if (request.getSession().getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu3");
        if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.REPORTE_REMESA_POR_PROCESAR)) {
            return FORM_ACCESS_NULL_VIEW;
        }    
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        
        //int accionMapa = 1;
        String cliente = (String)request.getSession().getAttribute("cliente");
        String sucursal = (String)request.getSession().getAttribute("sucursal");
        
        String cuenta = form.getCuenta();
        String boveda = form.getModulo();
        String fecha = form.getFecha();
        form.setFecha(fecha);
        try {
            int unidad = 
                servicioHermetic.getTipoUnidadMonetaria(sucursal, 
                                                              cliente, cuenta, 
                                                              boveda);
            if (unidad != 999) {
                FechaCuentaBean fcbean = 
                    servicioHermetic.getFechaCuenta(sucursal, cliente, 
                                                          cuenta, boveda);
                form.setFechadesde(fcbean.getFecha());
                form.setHora(fcbean.getHora());
            } else {
                form.setFechadesde(null);
                form.setHora(null);
            }
            form.setCuenta(form.getCuenta());
            List listaModulos = 
                servicioHermetic.getBovedaCuenta(sucursal, cliente, 
                                                       cuenta);
            if (listaModulos != null) {
                model.put("listaModulo", listaModulos);
            }
            List listadoCuentas = 
                servicioHermetic.getCuentas(sucursal, cliente);
            if (listadoCuentas != null) {
                model.put("listaCuentas", listadoCuentas);
            }
            form.setCliente(cliente);
            form.setSucursal(sucursal);
      
            model.put(FORM_KEY,form);  
        } catch (Exception e) {
            e.printStackTrace();
            //accionMapa = 0;
            return FORM_ERROR_VIEW;
        }

        return FORM_REMESA_POR_PROCESAR_VIEW;
    }    
    
    
    @RequestMapping(params="accion=mostrar")
    private String mostrar (ModelMap model,@ModelAttribute(FORM_KEY) HMF3002Form form, HttpServletRequest request) throws Exception {    
    
        HttpSession session = request.getSession(false);        
        if (request.getSession().getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu3");
        if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.REPORTE_REMESA_POR_PROCESAR)) {
            return FORM_ACCESS_NULL_VIEW;
        }    
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        
        //int accionMapa = 1;
        String cliente = (String)request.getSession().getAttribute("cliente");
        String sucursal = (String)request.getSession().getAttribute("sucursal");
        form.setCliente(cliente);
        form.setSucursal(sucursal);        

        String fechaDesde = form.getFechadesde();
        //String cuenta = form.getCuenta();
        //String fecha = form.getFecha();
        String fecha = form.getFechadesde();
        //        int tipoUnidad =  servicioHermetic.getTipoUnidadMonetaria(sucursal,cliente,form.getCuenta(),form.getModulo());
         List listCuentas = new ArrayList(); 
         List listModulos = new ArrayList(); 

        try {
            
            /************** Valores por defecto elegidos para Cuenta y Modulo *************/
            // Cuentas
             String[] chksCuenta = null;
            if (form.getCuenta()!=null && form.getCuenta().equals(ConstantesHermetic.CTE_REP_CUENTA_TODOS)){
                //TODOS las cuentas
                listCuentas = servicioHermetic.getCuentas(form.getSucursal(), form.getCliente());  
                chksCuenta = Util.listToStringArray(listCuentas);            
                request.getSession(false).setAttribute("chksCuenta",chksCuenta);                 
            }else{
                //ALGUNAS cuentas
                chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");
                request.getSession(false).setAttribute("chksCuenta",chksCuenta);
            }
            
            // Modulos por Unidad Monetaria y Cuentas
            String[] chksModulo = null; 
            if (chksCuenta!=null && chksCuenta.length > 0 &&
                form.getTipoUnidMone()!=null && !form.getTipoUnidMone().equals(ConstantesHermetic.CTE_REP_UNID_MONE_BLANCO)){            

                chksModulo = (String[])request.getSession(false).getAttribute("chksModulo");              
                
                
                /*
                if (("1").equals(form.getTipoUnidMone())){
                    //Total en session mayor a CERO
                    request.getSession(false).setAttribute("chksModulo",chksModulo);                
                }else{
                    //obtengo todos los modulos del tipo de unidad monetaria
                     String arrayCuentas = Util.arrayToString(chksCuenta,",");                
                     listModulos = servicioHermetic.getBovedaByCuentaMoneMulti(form.getSucursal(), form.getCliente(), arrayCuentas, form.getTipoUnidMone());
                     //listModulos = servicioHermetic.getBovedaCuenta(form.getSucursal(), form.getCliente(), arrayCuentas);                        
                     chksModulo = Util.listToStringArray(listModulos);            
                     request.getSession(false).setAttribute("chksModulo",chksModulo);                   
                }            
                */
            }
             /************** Valores por defecto elegidos para Cuenta y Modulo - Fin *************/
            
             //Obtiene el listado de Unidad de Moneda
             String codCuentasAlgunos = Util.arrayToString((String[])session.getAttribute("chksCuenta"),",");
                         
             
            //Agregar el codigo de cuenta de la pagina
            List listadoCuentas = servicioHermetic.getCuentas(sucursal, cliente);
            String[] chksCuentas = (String[])request.getSession(false).getAttribute("chksCuentas");
            String tipoUnidMoneSession =  (String)request.getSession(false).getAttribute("tipoUnidMone");        
            String tipoUnidMone = request.getParameter("tipoUnidMone");
            if((tipoUnidMone!=null && !tipoUnidMone.equals(tipoUnidMoneSession))){
                String arrayCuentas = Util.arrayToString(chksCuenta,",");                
                listModulos = servicioHermetic.getBovedaByCuentaMoneMulti(form.getSucursal(), form.getCliente(), arrayCuentas, form.getTipoUnidMone());
                //listModulos = servicioHermetic.getBovedaCuenta(form.getSucursal(), form.getCliente(), arrayCuentas);                        
                chksModulo = Util.listToStringArray(listModulos);            
                request.getSession(false).setAttribute("chksModulo",chksModulo);
            }
            String codModulos = Util.arrayToString((String[])session.getAttribute("chksModulo"),",");    
            String codCuentas = null;
            if (listadoCuentas != null) {            
                //Por defecto esta marcado TODOS las cuentas            
                String[] chksCuentaTodos = Util.listToStringArray(listadoCuentas);     
                String codCuentasTodos = Util.arrayToString(chksCuentaTodos,",");
                if(("2").equals(form.getCuenta()))
                    codCuentas = codCuentasAlgunos;
                else
                    codCuentas = codCuentasTodos;
                //Agregar el codigo de cuenta de la pagina
                List listadoUnidMone = servicioHermetic.getTipoUnidadMonetariaCuentaMulti(sucursal, cliente, codCuentas);
                if (listadoUnidMone != null) {
                    model.put("listadoUnidMone", listadoUnidMone);
                }            
            }   
            if(Util.contDatosSession(chksModulo) < 1){
                model.put("message","Seleccione al menos una boveda");
                return FORM_REMESA_POR_PROCESAR_VIEW;
            }
                
            if ( codCuentas !=null && codCuentas.length() > 0 && codModulos !=null && codModulos.length() > 0 ){                     
                List listaRemesasPorProcesar = servicioHermetic.getRemesasPorProcesar(fechaDesde,
                                                                                       cliente, 
                                                                                       codCuentas, 
                                                                                       codModulos, 
                                                                                       sucursal);
                double suma1 = 0;
                if (listaRemesasPorProcesar != null) {
                    for (int i = 0; i < listaRemesasPorProcesar.size(); i++) {
                        ComprobanteServicioBean bean = new ComprobanteServicioBean();
                        bean = (ComprobanteServicioBean)listaRemesasPorProcesar.get(i);
                        if (bean != null) {
                            suma1 = suma1 + Double.parseDouble(bean.getContiene().trim());
                        }
                    }
    
                    DecimalFormatSymbols dfs = new DecimalFormatSymbols();
                    dfs.setDecimalSeparator('.');
                    dfs.setGroupingSeparator(',');
                    DecimalFormat df1 = new DecimalFormat("###,###,##0.00", dfs);
                    df1.setGroupingSize(3);
    
                    model.put("suma1", String.valueOf(df1.format(suma1)));
    
                    model.put("listaRemesasPorProcesar", listaRemesasPorProcesar);
                }
    
                //Al cierre
                try {
                    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
    
                    // Get Date 1
                    Date d1 = df.parse(fechaDesde);
    
                    // Get Date 2
                    Date d2 = df.parse(fecha);
    
                    String relation;
                    if (d1.equals(d2)) {
                        relation = "Las fechas son iguales";
                        java.util.Date date = new java.util.Date();
                        DateFormat dt = DateFormat.getTimeInstance(DateFormat.SHORT);
                        String h = dt.format(date);
                        form.setHora(h);
                    } else if (d1.before(d2)) {
                        relation = "Anterior";
                        if (listaRemesasPorProcesar != null) {
                            form.setHora("Al Cierre");
                        }
                    } else {
                        relation = "Mayor";
                    }
                    //System.out.println(d1 + " es " + relation + ' ' + d2);
                } catch (Exception e) {
                    e.printStackTrace();
                    //                  accionMapa = 0;
                }
                //Fin al cierre
            }
      
            model.put(FORM_KEY,form);  
        } catch (Exception e) {
            e.printStackTrace();
            //accionMapa = 0;
            return FORM_ERROR_VIEW;
        }

        return FORM_REMESA_POR_PROCESAR_VIEW;
    }      
    
    @RequestMapping(params="accion=mostrarReporte")
    private void mostrarReporte (ModelMap model,@ModelAttribute(FORM_KEY) HMF3002Form form, HttpServletRequest request, HttpServletResponse response) throws Exception {        
    
        List listCuentas = new ArrayList(); 
        List listModulos = new ArrayList(); 
        form.setCliente((String)request.getSession(false).getAttribute("cliente"));
        form.setSucursal((String)request.getSession(false).getAttribute("sucursal"));        
        
        // Cuentas
         String[] chksCuenta = null;
        if (form.getCuenta()!=null && form.getCuenta().equals(ConstantesHermetic.CTE_REP_CUENTA_TODOS)){
            //TODOS las cuentas
            listCuentas = servicioHermetic.getCuentas(form.getSucursal(), form.getCliente());  
            chksCuenta = Util.listToStringArray(listCuentas);            
            request.getSession(false).setAttribute("chksCuenta",chksCuenta); 
            
        }else{
            //ALGUNAS cuentas
            chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");
            request.getSession(false).setAttribute("chksCuenta",chksCuenta);
        }
        
        // Modulos por Unidad Monetaria y Cuentas            
        if (chksCuenta!=null && chksCuenta.length > 0 &&
            form.getTipoUnidMone()!=null && !form.getTipoUnidMone().equals(ConstantesHermetic.CTE_REP_UNID_MONE_BLANCO)){            

            String[] chksModulo = (String[])request.getSession(false).getAttribute("chksModulo");
            String tipoUnidMoneSession =  (String)request.getSession(false).getAttribute("tipoUnidMone");        
            String tipoUnidMone = request.getParameter("tipoUnidMone");
            if((tipoUnidMone!=null && !tipoUnidMone.equals(tipoUnidMoneSession))){
                String arrayCuentas = Util.arrayToString(chksCuenta,",");                
                listModulos = servicioHermetic.getBovedaByCuentaMoneMulti(form.getSucursal(), form.getCliente(), arrayCuentas, form.getTipoUnidMone());
                //listModulos = servicioHermetic.getBovedaCuenta(form.getSucursal(), form.getCliente(), arrayCuentas);                        
                chksModulo = Util.listToStringArray(listModulos);            
                request.getSession(false).setAttribute("chksModulo",chksModulo);
            }  
            /*
            if (Util.contDatosSession(chksModulo) > 0){
                //Total en session mayor a CERO
                request.getSession(false).setAttribute("chksModulo",chksModulo);
            
            }else{
                //obtengo todos los modulos del tipo de unidad monetaria
                 String arrayCuentas = Util.arrayToString(chksCuenta,",");                
                 listModulos = servicioHermetic.getBovedaByCuentaMoneMulti(form.getSucursal(), form.getCliente(), arrayCuentas, form.getTipoUnidMone());
                 //listModulos = servicioHermetic.getBovedaCuenta(form.getSucursal(), form.getCliente(), arrayCuentas);                        
                 chksModulo = Util.listToStringArray(listModulos);            
                 request.getSession(false).setAttribute("chksModulo",chksModulo);                   
            }            
        */
        }
        request.getSession(false).setAttribute("fromHWF3002","true");
        reporteFactory.mostraReporte(request,response,form.getCliente());       
        
    }    
    
   
 
}
